package com.excilys.capicsoubank.dao.impl;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;

import com.excilys.capicsoubank.dao.GenericDao;

/**
 * Classe mère des DAO entités permettant de créer, de mettre à jour et de
 * supprimer une entité à partir des classes filles.
 * 
 * @author Guillaume Lenoir
 * 
 * @param <T>
 *            type de l'entité managé par le dao
 */
public class GenericDaoImpl<T> implements GenericDao<T> {

	@Autowired
	protected SessionFactory sessionFactory;

	private final Class<T> entityClass;

	public GenericDaoImpl(Class<T> entity) {
		this.entityClass = entity;
	}

	/**
	 * @param entity
	 *            Instance à persister
	 * 
	 */
	@Override
	public void saveEntity(T entity) {
		getCurrentSession().persist(entity);
	}

	/**
	 * @param entity
	 *            Instance à supprimer
	 */
	@Override
	public void deleteEntity(T entity) {
		getCurrentSession().delete(entity);
	}

	/**
	 * @param entity
	 *            Instance à mettre à jour
	 */
	@Override
	public void updateEntity(T entity) {
		getCurrentSession().update(entity);
	}

	/**
	 * Obtention d'une entité par l'identifiant.
	 * 
	 * @param entityId
	 *            Id de l'entité à récupérer
	 * @return T retourne l'entité
	 */
	@Override
	@SuppressWarnings("unchecked")
	public T getById(int entityId) {
		return (T) getCurrentSession().get(entityClass, entityId);
	}

	/**
	 * @return Session La session actuelle
	 */
	public Session getCurrentSession() {
		return sessionFactory.getCurrentSession();
	}

}
